package com.cskaoyan.javase.oop2._1extends._9override;

/**
 * 方法的覆盖的语法
 * 在具体讲解方法覆盖的语法前,先学习一个注解`@Override`
 * Override这个单词就是重写的意思
 * 这个注解的作用是: 写在子类方法头的上面,用来检查该方法是否为重写自父类的方法
 *      如果是,就正常通过编译
 *      如果不是,就会编译报错
 *
 * 注意: 在Java中,我们以后所有的方法的覆盖中,一定要写`@Override`注解,禁止重写方法不写注解
 *      它的好处:
 *      1.可以检查语法,确保是方法的重写
 *      2.增加代码可读性
 *
 * 当然你可能觉得写这个注解很麻烦,那我们在重写方法时就不要手写,而是用快捷键快速生成:
 *      1.直接在子类中写要重写的 父类方法 的方法名,然后回车,会自动添加注解
 *      2.alt + insert 选择override methods选项
 *
 * 接下来看方法重写的语法
 * 成员方法的定义:
 * [访问权限修饰] 返回值类型 方法名(形参列表){
 *     // 方法体
 * }
 * 当然,要想重写方法,首先需要继承,需要有一个父类,并且父类中需要有一个方法进行重写,这是前提
 * 接下来我们关注,子类重写方法时:
 *      1.访问权限修饰符必须保持一致吗?
 *      不需要完全一致,可以更宽松,但是不能更严格.当然保持一致肯定是可以的
 *
 *      2.返回值类型必须保持一致吗?
 *      不需要,子类方法中的返回值类型只需要和父类保持"兼容"就可以了.
 *      什么叫兼容呢?
 *      那就是今晚的作业.
 *
 *      3.方法名在重写中是不可能改的,改了就不算重写了,是重新定义了一个方法.
 *      4.形参列表必须严格和父类保持一致,不能做任何修改.
 *      5.方法体,无所谓,你想咋写咋写.
 *
 * 注意事项:
 *     思考:
 *     1.父类中的私有成员方法能不能重写呢?
 *     不能重写.私有方法虽然能继承,但没有访问权限进行重写.
 *
 *     2.父类中的构造方法能不能重写?
 *     不能重写.因为不能继承,更不能重写.
 *
 *     3.父类中静态成员方法能不能重写?
 *     不能,静态方法不算继承,更不算重写.
 *
 *
 * 面试题:
 *      方法重写(override) VS 方法重载(overload)
 * 首先方法的重写发生在两个类中,而方法的重载在一个类中
 *
 *
 *
 * @since 16:55
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo2 {
    public static void main(String[] args) {
        // Father fs = new Son();
        // fs.test();

        Father.testStatic();
        Son.testStatic();
    }
}

class Father {
    public void test() {
        System.out.println("father");
    }

    public static void testStatic(){
        System.out.println("static father");
    }
}

class Son extends Father {

    @Override
    public void test() {
        System.out.println("son");
    }
    // @Override 注解用来检查是否是合法的重写
    // public void test2(){}

    // @Override
    public static void testStatic(){
        System.out.println("static son");
    }
}